package dao

import (
	"errors"
	"fmt"
	"github.com/wonderivan/logger"
	"gorm.io/gorm"
	"k8s-platform/db"
	"k8s-platform/model"
)

var Git git

type git struct{}

// 列表
func (*git) List() ([]*model.HostServer, error) {
	hostservers := []*model.HostServer{}

	tx := db.DB.Preload("HostGroups").Preload("Credentials").Find(&hostservers)
	if tx.Error != nil {
		logger.Error(fmt.Sprintf("获取hostservers列表失败，%v\n", tx.Error))
		return nil, errors.New(fmt.Sprintf("获取hostservers列表失败，%v\n", tx.Error))
	}
	return hostservers, nil
}

// 新增
func (*git) Add(gits *model.Git) error {
	//创建hostservers的时候不创建HostGroups
	tx := db.DB.Create(&gits)
	if tx.Error != nil {
		logger.Error(fmt.Sprintf("添加hostservers失败，%v\n", tx.Error))
		return errors.New(fmt.Sprintf("添加hostservers失败，%v\n", tx.Error))
	}
	//如果有关联对象添加hostservers的时候关联HostGroups
	//if len(gits.HostGroups) > 0 {
	//if hostgroupID > 0 {
	//	//处理关联添加
	//	err := db.DB.Model(&git).Association("HostGroups").Append(&model.git{ID: hostgroupID})
	//	if err != nil {
	//		logger.Error(fmt.Sprintf("关联添加hostservers:HostGroups失败，%v\n", tx.Error))
	//		return errors.New(fmt.Sprintf("关联添加hostservers:HostGroups失败，%v\n", tx.Error))
	//	}
	//}
	//if credential > 0 {
	//	//处理关联添加
	//	err := db.DB.Model(&hostservers).Association("Credentials").Append(&model.Credential{ID: credential})
	//	if err != nil {
	//		logger.Error(fmt.Sprintf("关联添加hostservers:Credential失败，%v\n", tx.Error))
	//		return errors.New(fmt.Sprintf("关联添加hostservers:Credential失败，%v\n", tx.Error))
	//	}
	//} else {
	//	logger.Error(fmt.Sprintf("关联添加hostservers:CredentialID为0，请关联秘钥，%v\n", tx.Error))
	//	return errors.New(fmt.Sprintf("关联添加hostservers:CredentialID为0，请关联秘钥，%v\n", tx.Error))
	//}
	return nil
}

// 基于Git_url查询单个，用于新增的时候判断Git_url是否重复
func (*git) Has(Gitid int64) (*model.Git, bool, error) {
	data := &model.Git{}

	tx := db.DB.Where("id = ?", Gitid).First(&data)
	if errors.As(tx.Error, &gorm.ErrRecordNotFound) {
		return nil, false, nil
	}
	if tx.Error != nil {
		logger.Error(fmt.Sprintf("查询Git_url失败了, %v\n", tx.Error))
		return nil, false, errors.New(fmt.Sprintf("查询Git_url失败了, %v\n", tx.Error))
	}
	return data, true, nil
}

// 基于id查询单个，用于查询单个详情
func (*git) Get(id int64) (*model.HostServer, bool, error) {
	data := &model.HostServer{}
	tx := db.DB.Where("id = ?", id).First(&data)
	if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
		return nil, false, nil
	}
	if tx.Error != nil {
		logger.Error(fmt.Sprintf("查询server失败, %v\n", tx.Error))
		return nil, false, errors.New(fmt.Sprintf("查询server失败, %v\n", tx.Error))
	}
	return data, true, nil
}

// 更新
func (*git) Update(git *model.Git, gitID int64) error {
	tx := db.DB.Model(&model.Git{}).Where("id = ?", &gitID).Updates(&git)
	if tx.Error != nil {
		logger.Error(fmt.Sprintf("更新credential失败, %v\n", tx.Error))
		return errors.New(fmt.Sprintf("更新credential失败, %v\n", tx.Error))
	}
	return nil
}

// 同步
func (*git) Sync(hostservers *model.HostServer, hostgroupID int64) error {

	tx := db.DB.Where("id = ?", hostgroupID).Model(&hostservers).Updates(&model.HostServer{Hostname: hostservers.Hostname, Cpu: hostservers.Cpu, Memory: hostservers.Memory, Disk: hostservers.Disk})
	if tx.Error != nil {
		logger.Error(fmt.Sprintf("同步hostservers失败，%v\n", tx.Error))
		return errors.New(fmt.Sprintf("同步hostservers失败，%v\n", tx.Error))
	}
	return nil
}

// 删除
func (*git) Delete(hostservers *model.HostServer, id int64) error {
	//先清空关联关系
	err := db.DB.Model(&hostservers).Association("HostGroups").Clear()
	if err != nil {
		logger.Error("关联删除Role:Permission失败, " + err.Error())
		return errors.New("关联删除Role:Permission失败, " + err.Error())
	}
	err2 := db.DB.Model(&hostservers).Association("Credentials").Clear()
	if err2 != nil {
		logger.Error("关联删除Role:Permission失败, " + err2.Error())
		return errors.New("关联删除Role:Permission失败, " + err2.Error())
	}
	//再删除server数据
	tx := db.DB.Where("id = ?", id).Delete(&model.HostServer{})
	//tx := db.DB.Where("id = ?", id).Delete(&model.HostServer{})
	if tx.Error != nil {
		logger.Error("删除server失败, " + tx.Error.Error())
		return errors.New("删除server失败, " + tx.Error.Error())
	}
	return nil
}
